package pk.sistema.vendas.web.teste;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import pk.sistema.vendas.web.Hibernateutil;
import pk.sistema.vendas.web.produto.Produto;
import pk.sistema.vendas.web.produto.ProdutoRN;

public class ProdutoTeste {

	private static Session sessao;
	private static Transaction transacao;
	
	@Before
	public void setup(){
		Produto p1 = new Produto("UND","Caderno", new Date(), 40, 2.8d);
		Produto p2 = new Produto("KG","Sal", new Date(), 300, 1.8d);
		Produto p3 = new Produto("PCT","ACUCAR", new Date(), 500, 1.6d);
		Produto p4 = new Produto("UND","LAPIS", new Date(), 800, 2.28d);
		Produto p5 = new Produto("KG","FEIJAO", new Date(), 600, 3.8d);
		
		ProdutoRN produtoRN = new ProdutoRN();
		
		produtoRN.salvar(p1);
		produtoRN.salvar(p2);
		produtoRN.salvar(p3);
		produtoRN.salvar(p4);
		produtoRN.salvar(p5);
		/*
		sessao.save(p1);
		sessao.save(p2);
		sessao.save(p3);
		sessao.save(p4);
		sessao.save(p5);
		*/
	}
	
	/*
	@BeforeClass
	public static void abreConexao(){
		sessao = Hibernateutil.getSessao().getCurrentSession();
		transacao = sessao.beginTransaction();
	}
	*/
	

	@After
	public void limparBanco(){
		
	//	Criteria lista = sessao.createCriteria(Produto.class);
		//@SuppressWarnings("unchecked")
		ProdutoRN produtoRN = new ProdutoRN();
		
		//List<Produto> listaProduto = lista.list();
		List<Produto> produtos = produtoRN.listar();
		/*
		for (Produto produto : produtos) {
			sessao.delete(produto);
		}*/
		 
		for(Produto produto : produtos){
			produtoRN.excluir(produto);
		}
	}
	

	@Test
	public void salvarProdutoTeste(){
		//metodo de pesquisa
		//Query consulta = pesquisar("Sa");
		//Produto produtoPesquisado = (Produto) consulta.uniqueResult(); 
		
		ProdutoRN produtoRN = new ProdutoRN();
		Produto produtoSalvo = new Produto("lote","bola", new Date(), 40, 6.8d);
		
		produtoRN.salvar(produtoSalvo);
		Produto pesqiosandoProduto = produtoRN.pesquisarNome("bol");
		
		assertEquals("KG", pesqiosandoProduto.getUnidade());
	}
	
	@Test
	public void listaProdutosteste(){
		// trazer lista de produtos que tem no banco de dados 
		//Criteria lista = sessao.createCriteria(Produto.class);
		
		// aqui uma lista de produtos 
		//@SuppressWarnings("unchecked")
		//List<Produto> listaProduto = lista.list();
		ProdutoRN produtoRN = new ProdutoRN();
		List<Produto> produtos = produtoRN.listar();
		
		assertEquals(3, produtos.size());
		//assertEquals(5, listaProduto.size());
		
	}
	
	/*
	
	@AfterClass
	public static void fechaConexao(){
		//this.transacao.commit();
		
		try {
			transacao.commit();
			
		} catch (Throwable e) {
			System.out.println("Deu problema no Commit!!!"+ e.getMessage());
		}finally{
			try {
			
				if(sessao.isOpen()){
					sessao.close();
				}				
			} catch (Exception e2) {
				System.out.println("Deu problema ao fechar conexao!!!" +e2.getMessage());
			}
			
			}
		}
	
	
	@Test
	public void excluirProdutoTeste(){
		//metodo de pesquisa
		Query consulta = pesquisar("lapis");
		
		Produto produtoDeletado = (Produto) consulta.uniqueResult(); 
		sessao.delete(produtoDeletado);
		produtoDeletado = (Produto) consulta.uniqueResult();
		
		assertNull(produtoDeletado);
		
	}
	
	@Test
	public void alteracaoProdutoTeste(){
		//metodo de pesquisa
		Query consulta = pesquisar("lapis");
		
		Produto produtoAlterado = (Produto) consulta.uniqueResult();
		produtoAlterado.setEstoque(100);
			
		sessao.update(produtoAlterado);
		produtoAlterado = (Produto) consulta.uniqueResult();
		
		assertEquals(100, produtoAlterado.getEstoque().intValue());
	}


	private Query pesquisar(String pesquisa) {
		String sql = "from Produto p where p.descricao like :descricao";
		Query consulta = sessao.createQuery(sql);
		consulta.setString("descricao", "%"+pesquisa+"%");
		return consulta;
	}

	
	@Test
	public void salvarProdutoTeste(){
		Produto p1 = new Produto();
		p1.setDescricao("Produto teste");
		p1.setEstoque(40);
		p1.setDataCadastro(new Date());
		p1.setUnidade("KG");
		p1.setValor(1.5d);
	
	//abreConexao();
	this.sessao.save(p1);
	//fechaConexao();
	
	assertNull(null);
	
	}
*/
}
